import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'
import Layout from '@/layout'
const _import = require('./router/_import_' + process.env.NODE_ENV) // 获取组件的方法
NProgress.configure({
	showSpinner: false
}) // NProgress Configuration

const whiteList = ['/login'] // no redirect whitelist

router.beforeEach(async(to, from, next) => {
	// start progress bar
	NProgress.start()

	// set page title
	document.title = getPageTitle(to.meta.title)

	// determine whether the user has logged in
	const hasToken = getToken()

	if(hasToken) {
		if(to.path === '/login') {
			// if is logged in, redirect to the home page
			next({
				path: '/'
			})
			NProgress.done()
		} else {
			const hasGetUserInfo = store.getters.name
			if(hasGetUserInfo) {
				next()
			} else {
				try {
					// get user info
					await store.dispatch('user/getInfo')
					await store.dispatch('user/getDicts')
					await store.dispatch('user/getRouterList')
					if(store.getters.routerList.length < 1) {
						global.antRouter = []
						next()
					}
					const menus = filterAsyncRouter(store.getters.routerList) // 1.过滤路由
					 // 404 page must be placed at the end !!!
					const missArr = [{ path: '*', redirect: '/404', hidden: true }]
					menus.concat(missArr)
					router.addRoutes(menus) // 2.动态添加路由
					global.antRouter = menus // 3.将路由数据传递给全局变量，做侧边栏菜单渲染工作
					next({
              ...to,
              replace: true
            }) // hack方法 确保addRoutes已完成 ,set the replace
				} catch(error) {
					// remove token and go to login page to re-login
					await store.dispatch('user/resetToken')
					Message.error(error || 'Has Error')
					next(`/login?redirect=${to.path}`)
					NProgress.done()
				}
			}
		}
	} else {
		/* has no token*/

		if(whiteList.indexOf(to.path) !== -1) {
			// in the free login whitelist, go directly
			next()
		} else {
			// other pages that do not have permission to access are redirected to the login page.
			next(`/login?redirect=${to.path}`)
			NProgress.done()
		}
	}
})

router.afterEach(() => {
	// finish progress bar
	NProgress.done()
})

function filterAsyncRouter(asyncRouterMap) {
	
	const accessedRouters = asyncRouterMap.filter(route => {
		if(route.component) {
			if(route.component === 'Layout') {
				route.component = Layout
			} else {
				route.component = _import(route.component) // 导入组件
			}
		}
		if(route.children && route.children.length) {
			route.children = filterAsyncRouter(route.children)
		}
		return true
	})

	return accessedRouters
}